namespace IQIGame.Onigao.GamePlay
{
    public static class SceneBlockUtility
    {
        // 加载分块的半径，1表示周围8个格子，一共9个格子
        public const int LoadMapRange = 1;
        // 分块刷新间隔
        public const float BlockLoadCheckInterval = 0.25f;
        // 每个分块尺寸
        public const float BlockSize = 20f;
        // 额外超出多少距离，分块才会开始卸载。不然边界来回走，会频繁加载卸载 0-1的百分比，1代表整个块的半径
        private const float BlockUnloadExtraMin = 1.6f;    // 在一个边界处只有这么远的地方不会卸载
        public const float BlockUnloadExtraRatio = BlockUnloadExtraMin / BlockSize;
        // 块的最少存活时间3-4(秒)，包括加载，防止太快就卸载
        public const float BlockExistMinTime = 3f;
        // 两个分块加载之间的间隔时间(防止实例化卡顿)
        public const float BlockLoadInstantiateInterval = 0.2f;


        /// <summary>
        /// 索引坐标转id
        /// </summary>
        /// <param name="x"></param>
        /// <param name="y"></param>
        /// <returns></returns>
        public static int SceneBlockXY2Id(int x, int y)
        {
            return x << 16 | y;
        }

        /// <summary>
        /// id转索引坐标
        /// </summary>
        /// <param name="id"></param>
        /// <param name="x"></param>
        /// <param name="y"></param>
        public static void SceneBlockId2XY(int id, out int x, out int y)
        {
            x = id >> 16;
            y = id & 0xFFFF;
        }
    }
}
